#ifndef _DEVICE_PARAMETER_H_
#define _DEVICE_PARAMETER_H_

#include <string.h>
#include <stdint.h>
#include <config.h>
#include <stdbool.h>

/* 定义时区偏移 */
// 最小时区
#define MIX_TIME_ZONE_OFFSET                         (0ul)
// 最大时区
#define MAX_TIME_ZONE_OFFSET                         (24ul)
// 默认时区
#define DEFAULT_TIME_ZONE_OFFSET                     (8ul)

/* 系统音量等级 0 - 15 */
// 最小音量
#define MIX_VOLUME_LEVEL                             (0ul)
// 最大音量
#define MAX_VOLUME_LEVEL                             (15ul)
// 默认音量
#define DEFAULT_VOLUME_LEVEL                         MAX_VOLUME_LEVEL

/* 电机驱动时间 100 - 800 毫秒 */
// 最小电机驱动时间
#define MIX_MOTOR_DRIVE_TIME                         (10ul)
// 最大电机驱动时间
#define MAX_MOTOR_DRIVE_TIME                         (80ul)
// 默认电机驱动时间
#define DEFAULT_MOTOR_DRIVE_TIME                     (15ul)

/* 开锁时间 3 - 9 秒 */
// 最小开锁时间
#define MIX_UNLOCK_TIME                              (3ul)
// 最大开锁时间
#define MAX_UNLOCK_TIME                              (9ul)
// 默认开锁时间
#define DEFAULT_UNLOCKING_TIME                       (6ul)

/* 蓝牙连接超时时间 10 - 60 秒 */
// 最小连接超时时间
#define MIX_CONNECTION_TIMEOUT                       (10ul)
// 最大连接超时时间
#define MAX_CONNECTION_TIMEOUT                       (60ul)
// 默认连接超时时间
#define DEFAULT_CONNECTION_TIMEOUT                   (30ul)

/* 定义人脸检索时间 */
// 最小检索时间
#define MIX_FACE_SEARCH_TIME                         (3ul)
// 最大检索时间
#define MAX_FACE_SEARCH_TIME                         (20ul)
// 默认检索时间
#define DEFAULT_FACE_SEARCH_TIME                     (5ul)

/* 定义假锁警报间隔检测时间 */
// 最小间隔提示时间
#define MIX_FLASE_LOCK_DETCETION_INTERVAL_TIME       (1ul)
// 最大间隔提示时间
#define MAX_FLASE_LOCK_DETCETION_INTERVAL_TIME       (3ul)
// 默认间隔提示时间
#define DEFAULT_FLASE_LOCK_DETCETION_INTERVAL_TIME   (1ul)

/* 定义防撬警报间隔提示时间 */
// 最小间隔提示时间
#define MIX_BREAK_IN_DETCETION_INTERVAL_TIME         (1ul)
// 最大间隔提示时间
#define MAX_BREAK_IN_DETCETION_INTERVAL_TIME         (60ul)
// 默认间隔提示时间
#define DEFAULT_BREAK_IN_DETCETION_INTERVAL_TIME     (1ul)

/* 定义常开事件间隔提示时间 */
// 最小间隔提示时间
#define MIX_NORMAL_OPEN_HINT_INTERVAL_TIME           (5ul)
// 最大间隔提示时间
#define MAX_NORMAL_OPEN_HINT_INTERVAL_TIME           (60ul)
// 默认间隔提示时间
#define DEFAULT_NORMAL_OPEN_HINT_INTERVAL_TIME       (10ul)

/* 定义反锁事件间隔提示时间 */
// 最小间隔提示时间
#define MIX_LOCKED_IN_HINT_INTERVAL_TIME             (5ul)
// 最大间隔提示时间
#define MAX_LOCKED_IN_HINT_INTERVAL_TIME             (60ul)
// 默认间隔提示时间
#define DEFAULT_LOCKED_IN_HINT_INTERVAL_TIME         (10ul)

/* 定义识读M1卡扇区 3 - 15 */
// 可操作起始扇区号
#define START_OPERATION_M1_SECTOR                    (2ul)
// 可操作结束扇区号
#define END_OPERATION_M1_SECTOR                      (15ul)
// 默认使用扇区号
#define DEFAULT_OPERATION_M1_SECTOR                  (3ul)

/* 定义默认心跳发送间隔 */
// 最小心跳发送间隔
#define MIX_HEARTBEAT_CYCLE                          (10ul)
// 最大心跳发送间隔
#define MAX_HEARTBEAT_CYCLE                          (1440ul)
// 默认心跳发送间隔
#define DEFAULT_HEARTBEAT_CYCLE                      (360ul)

/* 定义最大持卡人数量 */
// 最小支持持卡人
#define MIX_NUMBER_OF_CARDHOLDER                     (30ul)
// 最大支持持卡人
#define MAX_NUMBER_OF_CARDHOLDER                     (100ul)
// 默认持卡人数量
#define DEFAULT_NUMBER_OF_CARDHOLDER                 MAX_NUMBER_OF_CARDHOLDER

/* 定义鉴权允许时间误差系数 */
// 最小允许误差系数
#define MIX_ALLOWABLE_TIME_ERROR                     (1ul)
// 最大允许误差系数
#define MAX_ALLOWABLE_TIME_ERROR                     (30ul)
// 默认允许误差系数
#define DEFAULT_ALLOWABLE_TIME_ERROR                 (5ul)

/* 定义播报天数额定值 */
// 最小播报天数
#define MIX_BROADCAST_DAYS                           (3ul)
// 最大播报天数
#define MAX_BROADCAST_DAYS                           (9ul)
// 默认播报天数
#define DEFAULT_BROADCAST_DAYS                       MAX_BROADCAST_DAYS

/* 定义键盘灵敏度阈值 */
// 最小值
#define MIX_KEYBOARD_SENSITIVITY                     (5ul)
// 最大值
#define MAX_KEYBOARD_SENSITIVITY                     (63ul)
// 默认灵敏度
#define DEFAULT_KEYBOARD_SENSITIVITY                 (10ul)

/* 定义卡片识读灵敏度 */
// 最小值
#define MIX_CARD_RECOGNITION_SENSITIVITY             (5ul)
// 最大值
#define MAX_CARD_RECOGNITION_SENSITIVITY             (48ul)
// 默认灵敏度
#define DEFAULT_CARD_RECOGNITION_SENSITIVITY         (15ul)

/* 定义更新蓝牙广播间隔时间 */
// 最小值
#define MIX_UPDATE_BLUETOOTH_BROADCAST_INTERVAL      (10ul)
// 最大值
#define MAX_UPDATE_BLUETOOTH_BROADCAST_INTERVAL      (60ul)
// 默认间隔时间
#define DEFAULT_UPDATE_BLUETOOTH_BROADCAST_INTERVAL  (30ul)

/* 定义系统锁定时间 */
// 最小锁定时间
#define MIX_SYSTEM_LOCKED_TIME                       (0ul)
// 最大锁定时间
#define MAX_SYSTEM_LOCKED_TIME                       (60ul)
// 默认锁定时间
#define DEFAULT_SYSTEM_LOCKED_TIME                   (30ul)

/* 定义默认日志堆栈深度 */
// 最大日志堆栈深度
#define MAX_OF_LOG_STACK_DEPTH                       (600ul)

// 默认加密密钥
#define DEFAULT_ENCRYPTION_KEY_VALUE                 ((uint8_t[ENCRYPTION_KEY_LENGTH]){"yglock.com"})
// 默认出厂日期
#define DEFAULT_LOCK_DELIVER_DATE                    0x00000000
#if _BOARD_TYPE_ == _6681_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE                       "6681_241224_STD_CN"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION                     "6681_250308_STD_CN"

#elif _BOARD_TYPE_ == _6681_B_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE                       "6681_241224_STD_CN"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION                     "6681_250308_STD_CN"

#elif _BOARD_TYPE_ == _M157_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE                       "V3157_250315_STD_N_A"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION                     "V31_BT_C_25042501_STD_CN"

#elif _BOARD_TYPE_ == _9905_A_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE                       "9905_250330_STD_CN"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION                     "9905_HZ_25042701_STD_CN"
  
#elif _BOARD_TYPE_ == _9905_B_BOARD_
// 默认电路板型号
#define DEFAULT_PCB_BOARD_TYPE                       "9905C_241102_CUS_R_A"
// 默认固件版本号
#define DEFAULT_FIRMWARE_VERSION                     "9905C_250219_CUS_N_A"
#endif

// 默认芯片型号
#define DEFAULT_CHIP_MODEL_NUMBER                    "CH584"
// 默认QC质检员编码
#define DEFAULT_QUALITY_INSPECTOR_CODE               "UNKOWN"

/* 定义默认服务器参数 */
#if _NETWORK_SERVICE_TYPE_ == _TCP_NETWORK_SERVICE_
// 默认服务器连接端口号
#define DEFAULT_CONNECT_SERVER_PORT                  4913
// 默认服务器域名
#define DEFAULT_DOMAIN_NAME                          "gw.yglock.com"

#elif _NETWORK_SERVICE_TYPE_ == _MQTT_NETWORK_SERVICE_
// 默认服务器连接端口号
#define DEFAULT_CONNECT_SERVER_PORT                  1883
// 默认服务器域名
#define DEFAULT_DOMAIN_NAME                          "gw.yglock.com"
#endif

// 默认服务器地址
#ifndef DEBUG
#define DEFAULT_SERVER_ADDRESS                       ((uint8_t[]){8, 129, 79, 168})

#else
#define DEFAULT_SERVER_ADDRESS                       ((uint8_t[]){47, 106, 35, 109})
#endif

// 默认 DNS 服务器地址
#define DEFAULT_DNS_SERVER_ADDRESS                   ((uint8_t[]){114, 114, 114, 114})

/* 定义 MQTT 相关默认参数 */
// 默认 MQTT 登录用户名
#define DEFAULT_MQTT_USER_NAME                       "user"
// 默认 MQTT 登录密钥
#define DEFAULT_MATT_PASSWORD                        "mqtt_6636"
// 默认 MQTT 服务器订阅主题
#define DEFAULT_MQTT_PUBLISH_TOPIC                   "ygs/lock/publish"
// 默认 MQTT 服务器发布主题
#define DEFAULT_MQTT_SUBSCRIBE_TOPIC                 "ygs/lock/subscribe"

// 默认超级管理员密码
#define DEFAULT_SUPER_ADMIN_PASSWORD                 ((char[NUMBER_OF_KEYBOARD_KEY]){'1', '2', '3', '4', '5', '6'})
// 默认扇区访问密钥
#define DEFAULT_M1_ACCESS_KEY                        ((uint8_t[]){0x58, 0x57, 0xB7, 0x68, 0xF4, 0xBD})
// 默认授权时间
#define DEFAULT_AUTHORIZATION_START_TIME             1735660800

// 系统锁定补偿时间 - 60s
#define SYSTEM_LOCKED_COMPENSATION_TIME              (60ul)

/**
 * @brief 离线卡禁用模式
 *
 */
typedef enum
{
  DISABLE_SPECIFIC_CARD_TYPE, // 禁用特定卡类型
  ENABLE_SPECIFIC_CARD_TYPE,  // 使能特定卡类型
} OfflineCardDisableMode_t;

/**
 * @brief 定义设备模式
 *
 */
typedef enum
{
  FACTORY_SETTING                    = 0x10, // 出厂设置
  NORMAL_MODE                        = 0x11, // 正常模式
  FIRMWARE_UPGRADE                   = 0x80, // 固件更新模式
} DeviceInitState_t;

/*
 * @brief 定义设备类型
 *
 */
typedef enum
{
  B_C                                 = 0x01, // 蓝牙刷卡线路板
  B_CM                                = 0x02, // 蓝牙卡密线路板
  BT_C                                = 0x03, // 蓝牙特高频刷卡线路板
  BT_CM                               = 0x04, // 蓝牙特高频卡密线路板
  BT_CMA                              = 0x05, // 蓝牙特高频卡密人脸线路板
  BT_CMF                              = 0x06, // 蓝牙特高频指纹卡密线路板
  B4_CM                               = 0x07, // 蓝牙4G(Cat.1)卡密线路板
  B4_CMA                              = 0x08, // 蓝牙4G(Cat.1)卡密人脸线路板
  B4_CMF                              = 0x09, // 蓝牙4G(Cat.1)卡密指纹线路板
  TYB_C                               = 0x64, // 天猫蓝牙刷卡线路板
  HYB_C                               = 0x6E, // 华为蓝牙刷卡线路板
  CRE_BWUSB_01                        = 0xC8, // 制卡器-蓝牙WiFiUSB版本
  TK_BW_CQ_01                         = 0xD2, // 梯控-蓝牙WiFi 刷卡二维码版本
  MJ_BCMQ_01                          = 0xDC, // 门禁-蓝牙卡密二维码版本
  TW_BC4_01                           = 0xE0, // 台湾定制蓝牙刷卡
  TYPE_NO_DEFINE                      = 0xFF, // 未定义
} DeviceType_t;

/**
 * @brief 卡片识读类型
 *
 */
typedef enum
{
  READER_BY_MIFARE_CARD               = 0x10, // MIFARE 卡（杨格）
  READER_BY_CPU_CARD                  = 0x11, // CPU 卡（杨格）
  READER_BY_IDENTIY_CARD              = 0x12, // 身份证
  READER_BY_MIFARE_CPU_CRAD           = 0x13, // MIFARE + CPU 卡
  READER_BY_MIFARE_IDENTIY_CRAD       = 0x14, // MIFARE + 身份证
  READER_BY_CPU_IDENTIY_CARD          = 0x15, // CPU + 身份证
  READER_BY_MIFARE_OTHER_CARD         = 0x16, // MIFARE + 其他
  READER_BY_CPU_OTHER_CARD            = 0x17, // CPU + 其他
  READER_BY_IDENTIY_OTHER_CARD        = 0x18, // 身份证 + 其他
  READER_BY_H_WORLD_GROUP_MIFARE_CARD = 0x80, // 华住 MIFARE 卡
  READER_BY_H_WORLD_GROUP_CPU_CARD    = 0x81, // 华住 CPU 卡
} TypeOfReading_t;

/**
 * @brief 协议格式
 *
 */
typedef enum
{
  PROTOCOL_FORMAT_YGS                   = 0x10, // YGS
  PROTOCOL_FORMAT_SMSZ                  = 0x11, // 尚美
} DevProtocolFormat_t;

/**
 * @brief 设置网络运营商
 *
 */
typedef enum
{
  CHINA_MOBILE                        = 0x10, // 中国移动
  CHINA_UNICOM                        = 0x11, // 中国联通
  CHINA_TELECOM                       = 0x12, // 中国电信
} NetworkOperator_t;

/**
 * @brief 离线卡类型
 *
 */
typedef enum
{
  GUEST_CARD                          = 0x11, // 宾客卡
  MASTER_CARD                         = 0x12, // 总卡
  BUILD_CARD                          = 0x13, // 楼栋卡
  FLOOR_CARD                          = 0x14, // 楼层卡
  PARK_CARD                           = 0x15, // 园区卡
  NORMAL_OPEN_CARD                    = 0x19, // 常开卡
} CardType_t;

#pragma pack(push, 1)

/**
 * @brief 封卡/封门标识
 *
 */
typedef union
{
  uint8_t Ident;

  struct OfflineCardEnBitClass
  {
    uint8_t MasterCard     : 1;
    uint8_t ParkCard       : 1;
    uint8_t BuildCard      : 1;
    uint8_t FloorCard      : 1;
    uint8_t GuestCard      : 1;
    uint8_t NormalOpenCard : 1;
    uint8_t Operation      : 1;
    uint8_t Function       : 1;
  } OfflineCardEnBit;
} OfflineCardEn_t;

/**
 * @brief 播报天数属性信息
 *
 */
typedef struct
{
  uint8_t ContorlEn;     // 控制位
  uint8_t RemainingDays; // 剩余天数
} RemainingDaysAttribute_t;

/**
 * @brief 卡片访问属性
 *
 */
typedef struct
{
  uint8_t Sector;                            // 识读扇区
  uint8_t TypeOfReading;                     // 识读类型
  uint8_t SectorKey[CRAD_SECTOR_KEY_LENGTH]; // 扇区密钥
} CardAccessAttribute_t;

/**
 * @brief 系统访问属性
 *
 */
typedef struct
{
  uint32_t CustomerCode;                           // 客户编码
  uint32_t AuthorizationEndTime;                   // 授权结束时间
  uint8_t EncryptionKey[ENCRYPTION_KEY_LENGTH];    // 加解密密钥
  char SuperAdminPassword[NUMBER_OF_KEYBOARD_KEY]; // 超级管理员密码
} SystemAccessAttribute_t;

/**
 * @brief 传感器控制
 *
 */
typedef union
{
  uint8_t  SensorFunctionControl;

  struct SensorControlBitClass
  {
    uint8_t KeyTiggerResetEn      : 1; // 钥匙重置使能位
    uint8_t StartTimeVerifyEn     : 1; // 开始时间验证使能
    uint8_t DoubleLockEn          : 1; // 允许开反锁
    uint8_t NormalOpenEn          : 1; // 常开使能
    uint8_t Reserved              : 4; // 保留位
  } SensorControlBit;
} SensorFunctionControl_t;

/**
 * @brief 错误提示功能控制
 *
 */
typedef union
{
  uint8_t Ident;

  struct ErrorPromptFunctionControlBitClass
  {
    uint8_t LockedTime   : 6; // 锁定时间
    uint8_t SafetyModule : 1; // 撬锁
    uint8_t Rfid         : 1; // 假锁
  } ErrorPromptFunctionControlBit;
} ErrorPromptFunctionControl_t;

/**
 * @brief 定义设备版本信息
 *
 */
typedef struct
{
  uint8_t DeviceModel;                                    // 设备类型
  uint32_t DateOfProduction;                              // 出厂日期
  char QCCode[NUMBER_OF_QC_CODE];                         // 质检员编码
  char ChipModel[NUMBER_OF_CHIP_TYPE_LENGTH];             // 芯片型号长度
  char PcbVersionNumber[NUMBER_OF_FIRMWARE_VERSION];      // 电路板版本号
  char FirmwareVersionNumber[NUMBER_OF_FIRMWARE_VERSION]; // 固件版本
  uint8_t Reserve[12];                                    // 预留
} VersionControl_t;

/**
 * @brief 卡顶替时间
 *
 */
typedef struct
{
  uint16_t ParkCardReplaceId;       // 园区卡顶替编码
  uint16_t BuildCardReplaceId;      // 楼栋卡顶替编码
  uint16_t FloorCardReplaceId;      // 楼层卡顶替编码
  uint16_t GusetCardReplaceId;      // 宾客卡顶替编码
  uint16_t MasterCardReplaceId;     // 总卡顶替编码
  uint16_t NormalOpenCardReplaceId; // 常开卡顶替编码

  uint32_t ParkCardReplaceTime;       // 园区卡顶替时间
  uint32_t BuildCardReplaceTime;      // 楼栋卡顶替时间
  uint32_t FloorCardReplaceTime;      // 楼层卡顶替时间
  uint32_t GusetCardReplaceTime;      // 宾客卡顶替时间
  uint32_t MasterCardReplaceTime;     // 总卡顶替时间
  uint32_t NormalOpenCardReplaceTime; // 常开卡顶替时间
  uint8_t Reserved[12];               // 预留
} ReplaceInformation_t;

/**
 * @brief 免打扰配置
 *
 */
typedef struct
{
  uint8_t StartHour;   // 开始时
  uint8_t StartMinute; // 开始分
  uint8_t EndHour;     // 结束时
  uint8_t EndMinute;   // 结束分
} NoDisturbingSetting_t;

/**
 * @brief 系统参数设置
 *
 */
typedef struct
{
  uint8_t TimeZone;                                        // 系统时区
  uint8_t SystemVolume;                                    // 系统音量
  uint8_t UnlockingTime;                                   // 开锁时间
  uint8_t MotorDriveTime;                                  // 电机驱动时间
  uint8_t NetworkOperator;                                 // 网络运营商
  uint16_t HeartbeatCyclel;                                // 心跳周期
  uint8_t NumberOfCardholder;                              // 持卡人数量
  uint8_t AllowableTimeError;                              // 鉴权时间误差
  uint8_t KeyBoardSensitivity;                             // 键盘灵敏度
  uint8_t SearchTimeout;                                   // 检索超时时间
  OfflineCardEn_t OfflineCardEn;                           // 离线卡使能配置
  uint8_t BreakInBlinkingInterval;                         // 撬锁警报间隔提示时间
  uint8_t ProtocolFormat;                                  // 协议格式
  uint8_t LockedInBlinkingInterval;                        // 反锁提示间隔时间
  uint8_t FlaseLockBlinkingInterval;                       // 假锁警报间隔提示时间
  uint8_t NormalOpenBlinkingInterval;                      // 常开提示间隔时间
  uint8_t BluetoothConnectionTimeout;                      // 蓝牙连接超时时间
  uint8_t BluetoothUpdateRaidioInterval;                   // 蓝牙广播更新时间
  uint32_t LastActiveTimestamp;                            // 最后活跃时间
  ErrorPromptFunctionControl_t ErrorPromptFunctionControl; // 错误提示功能控制
  uint8_t CardReadingSensitivity;                          // 卡片识别灵敏度
  uint8_t Reserve[5];                                      // 预留
} DeviceAttribute_t;

/**
 * @brief 描述网络属性
 *
 */
typedef struct
{
  uint16_t ServerPort;                                // 服务器端口号
  char Publish[NUMBER_OF_MQTT_TOPIC_BIT];             // 设备推送主题
  char Subscribe[NUMBER_OF_MQTT_TOPIC_BIT];           // 设备订阅主题
  char Password[NUMBER_OF_MQTT_PASSWORD_BIT];         // 登录密码
  char UserName[NUMBER_OF_MQTT_USER_NAME_BIT];        // 登录用户名
  uint8_t DnsAddress[NUMBER_OF_SERVER_IP_ADDRESS];    // DNS服务器IP地址
  char DomianName[NUMBER_OF_SERVER_DOMIAN_NAME_BIT];  // 域名地址
  uint8_t ServerAddress[NUMBER_OF_SERVER_IP_ADDRESS]; // 服务器IP地址
  uint8_t LOCKMAC[NUMBER_OF_LOCK_MAC];                  // 门锁的mac
  uint8_t Reserve[4];                                 // 预留
} NetworkAttribute_t;

/**
 * @brief 门锁归属信息
 *
 */
typedef struct
{
  uint32_t RoomId;         // 房间号
  uint8_t FloorId;         // 楼层
  uint8_t GardenId;        // 园区号
  uint8_t SubroomId;       // 子房间号
  uint8_t BuildingId;      // 楼栋
  uint16_t RoomType;       // 房间类型
  uint32_t GroupingNumber; // 分组号
  uint8_t Reserve[12];     // 预留
} AffiliationAttribute_t;

/**
 * @brief 授权管理
 *
 */
typedef struct
{
  CardAccessAttribute_t CardAccessAttribute;       // 卡片访问属性
  AffiliationAttribute_t AffiliationAttribute;     // 设备归属信息
  SystemAccessAttribute_t SystemAccessAttribute;   // 系统访问属性
  RemainingDaysAttribute_t RemainingDaysAttribute; // 有效天数
  uint8_t Reserve[12];                             // 预留
} LicenceInformation_t;

/**
 * @brief 系统配置信息
 *
 */
typedef struct
{
  uint8_t DeviceInitState;                 // 设备状态
  LicenceInformation_t LicenceInformation; // 授权信息

  VersionControl_t VersionControl;               // 版本控制
  DeviceAttribute_t DeviceAttribute;             // 设备属性
  NetworkAttribute_t NetworkAttribute;           // 网络属性
  ReplaceInformation_t ReplaceInformation;       // 卡片顶替时间
  NoDisturbingSetting_t NoDisturbingSetting;     // 免打扰配置
  SensorFunctionControl_t SensorFunctionControl; // 功能使能位
} DeviceInformation_t;
#pragma pack(pop)

/**
 * @brief 获取设备初始化状态
 *
 * @return uint8_t - 初始化状态
 */
extern uint8_t GetDeviceInitStatus(void);

/**
 * @brief 设置设备初始化状态
 *
 * @param Status - 初始化状态
 */
extern void SetDeviceInitStatus(uint8_t Status);

/**
 * @brief 获取钥匙重置使能标识
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetTheKeyToResetEn(void);

/**
 * @brief 设置获取钥匙重置使能标识
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetTheKeyToResetEn(bool En);

/**
 * @brief 获取开始时间验证使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetStartTimeVerifyEn(void);

/**
 * @brief 设置开始时间验证使能位
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetStartTimeVerifyEn(bool En);

/**
 * @brief 获取允许开反锁使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetAllowedToOpenDoubleLockEn(void);

/**
 * @brief 设置允许开反锁使能位
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetAllowedToOpenDoubleLockEn(bool En);

/**
 * @brief 获取常开使能位
 *
 * @return bool - 使能位(true:打开  false:关闭)
 */
extern bool GetNormalOpenEn(void);

/**
 * @brief 设置常开使能位
 *
 * @param En - 使能位(true:打开  false:关闭)
 */
extern void SetNormalOpenEn(bool En);

/**
 * @brief 批量获取设置板载功能
 *
 * @return uint8_t - 控制位
 */
extern uint8_t GetOnboardFunctionsInBatches(void);

/**
 * @brief 批量设置板载功能
 *
 * @param BasicContorl - 控制位
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetOnboardFunctionsInBatches(uint8_t BasicContorl);

/**
 * @brief 获取设备型号
 *
 * @return uint8_t - 设备型号
 */
extern uint8_t GetObtainTheDeviceModel(void);

/**
 * @brief 设置设备型号
 *
 * @param DeviceModel - 设备型号
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool SetObtainTheDeviceModel(DeviceType_t DeviceModel);

/**
 * @brief 获取质检员编码
 *
 * @param pCode - 质检员编码
 * @return bool - 获取状态(true:成功 false:失败)
 */
extern bool GetQualityInspectorCode(void *pCode);

/**
 * @brief 设置质检员编码
 *
 * @param pCode - 质检员编码
 * @return bool - 设置状态(true:成功 false:失败)
 */
extern bool SetQualityInspectorCode(const void *pCode);

/**
 * @brief 获取电路板版本信息
 *
 * @param pModel - 电路板版本号
 * @return bool  - 获取状态(true:成功 false:失败)
 */
extern bool ObtainCircuitBoardModel(void *pModel);

/**
 * @brief 设置门锁电路板版本信息
 *
 * @param pModel - 电路板版本号
 * @return bool  - 设置状态(true:成功 false:失败)
 */
extern bool WriteCircuitBoardType(const void *pModel);

/**
 * @brief 获取门锁出厂日期
 *
 * @return uint32_t - 出厂日期(时间戳方式显示)
 */
extern uint32_t ObtainTheDeliveryDateOfTheDevice(void);

/**
 * @brief 设置门锁出厂日期
 *
 * @param DateOfProduction - 出厂日期(时间戳方式显示)
 * @return bool            - 设置状态(true:成功 false:失败)
 */
extern bool SetTheDeviceDeliveryDate(uint32_t DateOfProduction);

/**
 * @brief 获取固件版本信息
 *
 * @param pModel - 固件版本号
 * @return bool  - 获取状态(true:成功 false:失败)
 */
extern bool GetDeviceFirmwareVersion(void *pVersion);

/**
 * @brief 设置固件版本信息
 *
 * @param pVersion - 固件版本号
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetDeviceFirmwareVersion(void *pVersion);

/**
 * @brief 获取芯片型号
 *
 * @param pChipModel - 芯片型号
 * @return bool      - 获取状态(true:成功 false:失败)
 */
extern bool GetChipModel(void *pChipModel);

/**
 * @brief 设置芯片型号
 *
 * @param pChipModel - 芯片型号
 * @return bool      - 设置状态(true:成功 false:失败)
 */
extern bool SettingTheChipModel(const char *pChipModel);

/**
 * @brief 获取系统时区
 *
 * @return uint8_t - 当前时区
 */
extern uint8_t GetSystemTimeZone(void);

/**
 * @brief 设置系统时区
 *
 * @param TimeZone - 新时区
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetSystemTimeZone(uint8_t TimeZone);

/**
 * @brief 获取宾客卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetGuestCardReplaceId(void);

/**
 * @brief 设置宾客卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetGuestCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取总卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetMasterCardReplaceId(void);

/**
 * @brief 设置总卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetMasterCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取楼栋卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetBuildCardReplaceId(void);

/**
 * @brief 设置楼栋卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetBuildCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取楼层卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetFloorCardReplaceId(void);

/**
 * @brief 设置楼层卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetFloorCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取园区卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetParkCardReplaceId(void);

/**
 * @brief 设置园区卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetParkCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取常开卡顶替编码
 *
 * @return uint16_t - 顶替编码
 */
extern uint16_t GetNormalOpenCardReplaceId(void);

/**
 * @brief 设置常开卡顶替编码
 *
 * @param ReplaceId - 顶替编码
 * @return bool     - 设置状态(true:成功 false:失败)
 */
extern bool SetNormalOpenCardReplaceId(uint16_t ReplaceId);

/**
 * @brief 获取宾客卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetGuestCardReplaceTime(void);

/**
 * @brief 设置宾客卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetGuestCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取总卡卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetMasterCardReplaceTime(void);

/**
 * @brief 设置总卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetMasterCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取楼栋卡卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetBuildCardReplaceTime(void);

/**
 * @brief 设置楼栋卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetBuildCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取楼层卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetFloorCardReplaceTime(void);

/**
 * @brief 设置楼层卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetFloorCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取园区卡卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetParkCardReplaceTime(void);

/**
 * @brief 设置园区卡卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetParkCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取设置常开卡片顶替时间
 *
 * @return uint32_t - 卡片顶替时间
 */
extern uint32_t GetNormalOpenCardReplaceTime(void);

/**
 * @brief 设置设置常开卡片顶替时间
 *
 * @param ReplaceTime - 卡片顶替时间
 * @return bool       - 设置状态(true:成功 false:失败)
 */
extern bool SetNormalOpenCardReplaceTime(uint32_t ReplaceTime);

/**
 * @brief 获取系统音量等级
 *
 * @return uint8_t - 音量等级(0-9)
 */
extern uint8_t GetSystemVolumeLevel(void);

/**
 * @brief 设置系统音量等级
 *
 * @param VolumeLevel - 音量等级(0-9)
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool SetSystemVolumeLevel(uint8_t VolumeLevel);

/**
 * @brief 获取电机驱动时间
 *
 * @return uint8_t - 电机驱动时间
 */
extern uint8_t GetMotorDriveTime(void);

/**
 * @brief 设置电机驱动时间
 *
 * @param DriveTime - 电机驱动时间
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool SetMotorDriveTime(uint8_t DriveTime);

/**
 * @brief 获取自动关锁时间
 *
 * @return uint8_t - 关锁时间
 */
extern uint8_t GetUnlockTime(void);

/**
 * @brief 设置自动关锁时间
 *
 * @param TimeOfUnlock - 关锁时间
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetUnlockTime(uint8_t TimeOfUnlock);

/**
 * @brief 获取网络运营商
 *
 * @return NetworkOperator_t - 网络运营商
 */
extern uint8_t GetNetworkOperator(void);

/**
 * @brief 设置网络运营商
 *
 * @param Operator - 运营商
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetNetworkOperator(uint8_t Operator);

/**
 * @brief 获取心跳发送间隔周期
 *
 * @return uint16_t - 心跳间隔
 */
extern uint16_t GetHeartbeatTransmissionCycle(void);

/**
 * @brief 设置心跳发送间隔周期
 *
 * @param HeartbeatCyclel - 心跳间隔
 * @return bool           - 设置状态(true-成功  false-失败)
 */
extern bool SetHeartbeatTransmissionCycle(uint16_t HeartbeatCyclel);

/**
 * @brief 获取持卡人数量
 *
 * @return uint8_t - 持卡人数量
 */
extern uint8_t GetNumberOfCardholder(void);

/**
 * @brief 设置持卡人数量
 *
 * @param Quantity - 持卡人数量
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetNumberOfCardholder(uint8_t Quantity);

/**
 * @brief 获取鉴权时间判断允许误差
 *
 * @return uint8_t - 误差系数
 */
extern uint8_t GetAllowableTimeError(void);

/**
 * @brief 设置鉴权时间判断允许误差
 *
 * @param TimeError - 误差系数
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetAllowableTimeError(uint8_t TimeError);

/**
 * @brief 获取键盘灵敏度
 *
 * @return uint8_t - 键盘灵敏度
 */
extern uint8_t GetKeyboardSensitivity(void);

/**
 * @brief 设置键盘灵敏度
 *
 * @param Sensitivity - 键盘灵敏度
 * @return bool       - 设置状态（true：成功 false：失败）
 */
extern bool SetKeyboardSensitivity(uint8_t Sensitivity);

/**
 * @brief 获取离线卡使能配置
 *
 * @return uint8_t - 使能配置
 */
extern uint8_t GetOfflineCardFunctionEnable(void);

/**
 * @brief 设置离线卡使能配置
 *
 * @param EnableBit - 使能配置
 * @return bool     - 设置状态（true：成功 false：失败）
 */
extern bool SetOfflineCardFunctionEnable(uint8_t EnableBit);

/**
 * @brief 获取摄像头鉴权模式
 *
 * @return uint8_t - 协议格式
 */
extern uint8_t GetProtocolFormat(void);

/**
 * @brief 设置协议格式
 *
 * @param ProtocolFormat - 协议格式
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool SetProtocolFormat(uint8_t ProtocolFormat);

/**
 * @brief 获取检索时间
 *
 * @return uint8_t - 超时时间
 */
extern uint8_t GetSearchTimeout(void);

/**
 * @brief 设置人脸检索时间
 *
 * @param SearchTime - 检索时间
 * @return bool      - 设置状态(true-成功  false-失败)
 */
extern bool SetSearchTimeout(uint8_t SearchTime);

/**
 * @brief 获取宾客卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetGuestCardEn(void);

/**
 * @brief 设置总卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetMasterCardEn(void);

/**
 * @brief 获取楼栋卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetBuildCardEn(void);

/**
 * @brief 获取楼层卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetFloorCardEn(void);

/**
 * @brief 获取园区卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetParkCardEn(void);

/**
 * @brief 获取常开卡使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetNormalOpenCardEn(void);

/**
 * @brief 获取蓝牙连接超时时间
 *
 * @return uint8_t - 超时时间
 */
extern uint8_t GetBluetoothConnectionTimeout(void);

/**
 * @brief 设置蓝牙连接超时时间
 *
 * @param Timeout - 超时时间
 * @return bool   - 设置状态(true-成功  false-失败)
 */
extern bool SetBluetoothConnectionTimeout(uint8_t Timeout);

/**
 * @brief 获取蓝牙更新广播间隔时间
 * 
 * @return uint8_t - 更新间隔时间
 */
extern uint8_t GetBluetoothUpdateRaidioInterval(void);

/**
 * @brief 设置蓝牙广播更新间隔时间
 * 
 * @param Interval - 更新间隔时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetBluetoothUpdateRaidioInterval(uint8_t Interval);

/**
 * @brief 获取设备最后一次操作时间
 * 
 * @return uint32_t - 操作时间
 */
extern uint32_t GetDeviceLastActionTime(void);

/**
 * @brief 设置设备最后一次操作时间
 *
 * @param Time - 操作时间
 */
extern void SetDeviceLastActionTime(uint32_t Time);

/**
 * @brief 获取错误提示功能
 * 
 * @return uint8_t - 错误提示功能
 */
extern uint8_t GetErrorPromptFunctionConfiguration(void);

/**
 * @brief 设置错误提示功能
 *
 * @param Configuration - 错误提示功能
 * @return bool         - 设置状态(true-成功  false-失败)
 */
extern bool SetErrorPromptFunctionConfiguration(uint8_t Configuration);

/**
 * @brief 获取 RFID 错误提示使能
 * 
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetRfidErrorPromptFunctionEnable(void);

/**
 * @brief 设置 RFID 错误提示使能
 *
 * @param En - 使能状态(true:打开  false:关闭)
 */
extern void SetRfidErrorPromptFunctionEn(bool En);

/**
 * @brief 获取安全模块错误提示使能
 *
 * @return bool - 使能状态(true:打开  false:关闭)
 */
extern bool GetSafetyModuleErrorPromptFunctionEnable(void);

/**
 * @brief 设置安全模块错误提示使能
 *
 * @param En - 使能状态(true:打开  false:关闭)
 */
extern void SetSafetyModuleErrorPromptFunctionEn(bool En);

/**
 * @brief 获取系统锁定时间
 *
 * @return uint8_t - 锁定时间
 */
extern uint8_t GetSystemLockedTime(void);

/**
 * @brief 设置系统锁定时间
 *
 * @param LockedInTime - 锁定时间
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetSystemLockedTime(uint8_t LockedInTime);

/**
 * @brief 获取读卡灵敏度
 *
 * @return uint8_t - 读卡灵敏度
 */
extern uint8_t GetCardReadingSensitivity(void);

/**
 * @brief 设置读卡灵敏度
 *
 * @param Sensitivity - 读卡灵敏度
 * @return bool       - 设置状态(true-成功  false-失败)
 */
extern bool SetCardReadingSensitivity(uint8_t Sensitivity);

/**
 * @brief 获取假锁警报间隔检测时间
 *
 * @return uint8_t - 间隔检测时间
 */
extern uint8_t GetFalseLockDetcetionInterval(void);

/**
 * @brief 设置假锁警报间隔检测时间
 *
 * @param Interval - 间隔检测时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetFalseLockDetcetionInterval(uint8_t Interval);

/**
 * @brief 获取撬锁警报间隔检测时间
 *
 * @return uint8_t - 间隔检测时间
 */
extern uint8_t GetTheBreakInDetcetionInterval(void);

/**
 * @brief 设置撬锁警报间隔检测时间
 *
 * @param Interval - 间隔检测时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetBreakInDetcetionInterval(uint8_t Interval);

/**
 * @brief 获取常开事件间隔提示时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t GetNormalOpenReminderInterval(void);

/**
 * @brief 设置常开提示间隔提示时间
 *
 * @param Interval - 间隔提示时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetNormalOpenReminderInterval(uint8_t Interval);

/**
 * @brief 获取反锁提示间隔时间
 *
 * @return uint8_t - 间隔提示时间
 */
extern uint8_t GetLockedInReminderInterval(void);

/**
 * @brief 设置反锁提示间隔时间
 *
 * @param Interval - 间隔提示时间
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetLockedInReminderInterval(uint8_t Interval);

/**
 * @brief 获取 DNS 服务器地址
 * 
 * @param pMaskAddr - DNS 服务器
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetDnsServerAddress(void *pMaskAddr);

/**
 * @brief 设置 DNS 服务器地址
 * 
 * @param pIpAddrIn - DNS服务器地址
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetDnsServerAddress(const void *pIpAddrIn);

/**
 * @brief 获取设备推送主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttPublishTopic(void *pTopic);

/**
 * @brief 设置设备推送主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttPublishTopic(const void *pTopic);

/**
 * @brief 设置设备订阅主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttSubscribeTopic(void *pTopic);

/**
 * @brief 设置设备订阅主题
 *
 * @param pTopic - 订阅主题
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttSubscribeTopic(const void *pTopic);

/**
 * @brief 获取Mqtt登录服务器的密码
 *
 * @param pPassword - 服务器的密码
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttPassword(void *pPassword);

/**
 * @brief 设置Mqtt登录服务器的密码
 *
 * @param pPassword - 服务器的密码
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttPassword(const void *pPassword);

/**
 * @brief 获取服务器目标端口
 *
 * @return uint16_t - 目标端口
 */
extern uint16_t GetNetworkServerPort(void);

/**
 * @brief 设置服务器目标端口
 *
 * @param ServerPort - 目标端口
 * @return bool      - 设置状态(true-成功  false-失败)
 */
extern bool SetNetworkServerPort(uint16_t ServerPort);

/**
 * @brief 获取服务器域名地址
 *
 * @param pMaskAddr - 域名地址
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetNetworkDomianName(void *pMaskAddr);

/**
 * @brief 设置服务器域名地址
 *
 * @param pMaskAddr - 域名地址
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetNetworkDomianName(const void *pDomianName);

/**
 * @brief 获取服务器目标地址
 *
 * @param pIpAddrOut - 目标地址
 * @return bool      - 获取状态(true-成功  false-失败)
 */
extern bool GetServerConnectAddress(void *pIpAddrOut);

/**
 * @brief 设置服务器目标地址
 *
 * @param pIpAddrIn - 目标地址
 * @return bool      - 获取状态(true-成功  false-失败)
 */
extern bool SetServerConnectAddress(const void *pIpAddrIn);

/**
 * @brief 获取Mqtt服务器的用户名
 *
 * @param pUserName - 用户名
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetMqttUserName(void *pUserName);

/**
 * @brief 设置Mqtt服务器的用户名
 *
 * @param pUserName - 用户名
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetMqttUserName(const void *pUserName);

/**
 * @brief 获取门锁所属园区编码
 *
 * @return uint8_t - 园区编码
 */
extern uint8_t GetLockGardenIdNumber(void);

/**
 * @brief 设置门锁所属园区编码
 *
 * @param GardenId - 园区编码
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetLockGardenIdNumber(uint8_t GardenId);

/**
 * @brief 获取门锁所处的楼栋
 *
 * @return uint8_t - 楼栋号
 */
extern uint8_t GetLockBuildingNumber(void);

/**
 * @brief 设置门锁所处的楼栋
 *
 * @param BuildingId - 楼栋号
 * @return bool      - 设置状态(true-成功  false-失败)
 */
extern bool SetLockBuildingNumber(uint8_t BuildingId);

/**
 * @brief 获取锁所处的楼层
 *
 * @return uint8_t - 楼层号
 */
extern uint8_t GetLockFloorNumber(void);

/**
 * @brief 设置门锁所处的楼层号
 *
 * @param FloorId - 楼层
 * @return bool   - 设置状态(true-成功  false-失败)
 */
extern bool SetLockFloorNumber(uint8_t FloorId);

/**
 * @brief 获取门锁所处的房间号
 *
 * @return uint32_t - 房间号
 */
extern uint32_t GetLockRoomIdNumber(void);

/**
 * @brief 设置门锁所处的房间号
 *
 * @param RoomId - 房间号
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetLockRoomIdNumber(uint32_t RoomId);

/**
 * @brief 获取门锁所处的子房间号
 *
 * @return uint8_t - 子房间号
 */
extern uint8_t GetLockSubroomNumber(void);

/**
 * @brief 设置门锁所处的子房间号
 *
 * @param SubroomId - 子房间号
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetLockSubroomNumber(uint8_t SubroomId);

/**
 * @brief 获取房间类型
 *
 * @return uint16_t - 房间类型
 */
extern uint16_t GetRoomType(void);

/**
 * @brief 设置房间类型
 *
 * @param RoomType - 房间类型
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetRoomType(uint16_t RoomType);

/**
 * @brief 获取分组号
 *
 * @return uint32_t - 分组号
 */
extern uint32_t GetGroupingNumber(void);

/**
 * @brief 设置分组号
 *
 * @param GroupingNumber - 分组号
 * @return bool    - 设置状态(true:成功 false:失败)
 */
extern bool SetGroupingNumber(uint32_t GroupingNumber);

/**
 * @brief 获取 MIFARE 卡识读扇区
 *
 * @return uint8_t - 目标扇区
 */
extern uint8_t GetCardOperationSector(void);

/**
 * @brief 设置 MIFARE 卡识读扇区
 *
 * @param SectorNumber - 目标扇区
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetCardOperationSector(uint8_t SectorNumber);

/**
 * @brief 获取识读卡片类型
 *
 * @return uint8_t - 卡片类型
 */
extern uint8_t GetReadTheCardType(void);

/**
 * @brief 设置识读卡片类型
 *
 * @param ReadType - 卡片类型
 * @return bool    - 设置状态(true-成功  false-失败)
 */
extern bool SetReadTheCardType(uint8_t ReadType);

/**
 * @brief 获取卡片访问密钥
 *
 * @param pKey  - 扇区访问密钥
 * @return bool - 获取状态(true-成功  false-失败)
 */
extern bool GetCardOperationSectorKey(uint8_t *pKey);

/**
 * @brief 设置设置访问密钥
 *
 * @param pKeyIn - 扇区访问密钥
 * @return bool  - 设置状态(true-成功  false-失败)
 */
extern bool SetCardOperationSectorKey(const uint8_t *pKeyIn);

/**
 * @brief 获取客户编码
 *
 * @return uint32_t - 客户编码
 */
extern uint32_t GetCustomerCode(void);

/**
 * @brief 设置客户编码
 *
 * @param CustomerCode - 客户编码
 * @return bool        - 设置状态(true-成功  false-失败)
 */
extern bool SetCustomerCode(uint32_t CustomerCode);

/**
 * @brief 获取授权结束时间
 *
 * @return uint32_t - 授权结束时间
 */
extern uint32_t GetAuthorizationEndTime(void);

/**
 * @brief 设置授权结束时间
 *
 * @param EndTime - 授权结束时间
 * @return bool   - 设置状态(true-成功  false-失败)

 */
extern bool SetAuthorizationEndTime(uint32_t EndTime);

/**
 * @brief 获取加解密密钥
 *
 * @param pEncryptionKey - 密钥
 * @return bool          - 获取状态(true-成功  false-失败)
 */
extern bool GetEncryptionKey(void *pEncryptionKey);

/**
 * @brief 设置加解密密钥
 *
 * @param pEncryptionKey - 密钥
 * @return bool          - 设置状态(true-成功  false-失败)
 */
extern bool SetEncryptionKey(const void *pEncryptionKey);

/**
 * @brief 获取超级管理员密码
 *
 * @param pPassword - 密码
 * @return bool     - 获取状态(true-成功  false-失败)
 */
extern bool GetSuperAdministratorPassword(void *pPassword);

/**
 * @brief 设置超级管理员密码
 *
 * @param pPassword - 密码
 * @return bool     - 设置状态(true-成功  false-失败)
 */
extern bool SetSuperAdministratorPassword(const void *pPassword);

/**
 * @brief 获取播报功能控制位
 *
 * @return bool - 开启状态（true：开启 false：关闭）
 */
extern bool GetDayBroadcastContorlEn(void);

/**
 * @brief 设置播报功能控制位
 *
 * @param ContorlEn - 开启状态（true：开启 false：关闭）
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool SetDayBroadcastContorlEn(uint8_t ContorlEn);

/**
 * @brief 获取开始播报天数
 *
 * @return uint8_t - 播报天数
 */
extern uint8_t GetBroadcastRemainingDays(void);

/**
 * @brief 设置开始播报天数
 *
 * @param Days  - 播报天数
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool SetBroadcastRemainingDays(uint8_t Days);

/**
 * @brief 获取免打扰起始时间 - 时
 *
 * @return uint8_t - 免打扰起始时间 - 时
 */
extern uint8_t GetNoDisturbingStartHour(void);

/**
 * @brief 设置免打扰起始时间 - 时
 *
 * @param StartHour - 免打扰起始时间 - 时
 * @return bool     - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingStartHour(uint8_t StartHour);

/**
 * @brief 获取免打扰起始时间 - 分
 *
 * @return uint8_t - 免打扰起始时间 - 分
 */
extern uint8_t GetNoDisturbingStartMinute(void);

/**
 * @brief 设备免打扰起始时间 - 分
 *
 * @param StartMinute - 免打扰起始时间 - 分
 * @return bool       - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingStartMinute(uint8_t StartMinute);

/**
 * @brief 获取免打扰结束时间 - 时
 *
 * @return uint8_t - 免打扰结束时间 - 时
 */
extern uint8_t GetNoDisturbingEndHour(void);

/**
 * @brief 设置免打扰结束时间 - 时
 *
 * @param EndHour - 免打扰结束时间 - 时
 * @return bool   - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingEndHour(uint8_t EndHour);

/**
 * @brief 获取免打扰结束时间 - 分
 *
 * @return uint8_t - 免打扰结束时间 - 时
 */
extern uint8_t GetNoDisturbingEndMinute(void);

/**
 * @brief 设置免打扰结束时间 - 分
 *
 * @param EndHour - 免打扰结束时间 - 分
 * @return bool   - 设置状态（true：成功  false：失败）
 */
extern bool SetNoDisturbingEndMinute(uint8_t EndMinute);

/**
 * @brief 恢复默认用户参数
 *
 */
extern void RestoreDefaultUserParameters(void);

/**
 * @brief 初始化设备参数
 *
 */
extern void InitialisingDeviceParameters(void);

/**
 * @brief 从内存中加载设备参数
 *
 */
extern void LoadDeviceParameterFromMemory(void);

/**
 * @brief 将设备参数写入到内存
 *
 */
extern bool WriteDeviceParametersToMemory(void);


extern bool SetLockMac(const void *pLockMac);
void GetLockMac(uint8_t *oPdate);
#endif
